import router from '@/router'
import NProgress from 'nprogress' // 进度条组价
import 'nprogress/nprogress.css' // 进度条样式
import getPageTitle from '@/utils/get-page-title'
import store from './store'
import { getToken } from '@/utils/auth'

// 路由守卫配置代码
NProgress.configure({ showSpinner: false }) // 进度条配置
// 白名单，意思是我们这个系统中有一些页面，不需要登录也可以访问，例如登录页
const whiteList = ['/login', '/404']

// 路由前置守卫
// 路由跳转之前执行 to:到哪里去 from:从哪里来 next:执行完一系列判断逻辑之后，必须要执行的函数
router.beforeEach(async (to, from, next) => {
  // 路由跳转之前开启这个进度条
  NProgress.start()

  // set page title
  document.title = getPageTitle(to.meta.title)

  // 从缓存中获取是否有token
  const hasToken = getToken()
  // 如果有token
  if (hasToken) {
    // 有token的情况下，判断是否去的是登录页
    if (to.path === '/login') {
      // 如果有token,但是还访问登录页的话，我们直接给他中转到主页去
      next('/')
      // 关闭进度条,因为如果我们的next('/')中设置了地址的话，那么不会走我们的后置守卫，需要我们手动关闭进度条
      NProgress.done()
    } else {
      // 如果有token，但是访问的不是登录页，那么直接放过
      // 这个地方去获取用户信息，因为每次切换路由，只要不是登录页，那么必须走这个地方
      // 判断是否获取过用户信息，如果没有获取过，那么我们就请求获取用户信息的接口
      if (!store.getters.userId) {
        // 结构里面的路由组件
        await store.dispatch('user/getUserInfo')
        const dynamicRoutes = await store.dispatch('user/getRouters')
        // 动态添加路由 老版本是使用addRoutes() 方法，新版本是使用addRoute()方法
        // router.addRoutes([...dynamicRoutes, { path: '*', redirect: '/404', hidden: true }])
        // 新版本是使用addRoute()方法 动态添加路由
        dynamicRoutes.forEach(route => {
          router.addRoute(route)
        })
        router.addRoute({ path: '*', redirect: '/404', hidden: true })
        // router添加动态路由之后，需要转发一下，因为我们的路由是异步加载的，所以需要手动触发一下，目的是让路由重新加载一下
        next({ ...to, replace: true })
      } else {
        next()
      }
    }
  } else {
    // 没有token的情况下，先判断我们要访问的页面是不是在白名单里面
    if (whiteList.indexOf(to.path) !== -1) {
      // 没有token,如果访问的路由地址在白名单中，那么直接放过
      next()
    } else {
      // 没有token,并且访问的路由也没有在白名单中，那么给重定向跳转到登录页，让他先去登录
      next('/login')
      NProgress.done()
    }
  }
})
// 路由后置守卫
router.afterEach(() => {
  // 路由跳转之后关闭这个进度条
  NProgress.done()
})
